/**
 * 路由守卫工具
 */
import { isLoggedIn, getCurrentUser, canAccessPage, getHomePathByRole } from './auth'

// 白名单页面（不需要登录即可访问）
const WHITE_LIST = [
  '/pages/index/index',
  '/pages/auth/login',
  '/pages/auth/role-select'
]

/**
 * 路由守卫 - 在页面跳转前执行
 */
export function routeGuard(): boolean {
  try {
    // 获取当前页面路径
    const pages = getCurrentPages()
    const currentPage = pages[pages.length - 1]
    const currentPath = `/${currentPage.route}`

    console.log('路由守卫检查:', currentPath)

    // 检查是否在白名单中
    if (WHITE_LIST.includes(currentPath)) {
      console.log('白名单页面，允许访问')
      return true
    }

    // 检查是否已登录
    if (!isLoggedIn()) {
      console.log('未登录，跳转到登录页')
      redirectToLogin()
      return false
    }

    // 检查页面权限
    if (!canAccessPage(currentPath)) {
      console.log('无权限访问页面:', currentPath)
      redirectToHome()
      return false
    }

    // 检查Token是否即将过期
    const user = getCurrentUser()
    if (user && isTokenExpiringSoon()) {
      console.log('Token即将过期，尝试刷新')
      handleTokenRefresh()
    }

    console.log('路由守卫通过')
    return true
  } catch (error) {
    console.error('路由守卫执行失败:', error)
    // 发生错误时，为了安全起见，跳转到登录页
    redirectToLogin()
    return false
  }
}

/**
 * 重定向到登录页
 */
function redirectToLogin(): void {
  uni.reLaunch({
    url: '/pages/auth/login',
    fail: (error) => {
      console.error('跳转登录页失败:', error)
    }
  })
}

/**
 * 重定向到角色对应的首页
 */
function redirectToHome(): void {
  const user = getCurrentUser()
  if (user) {
    const homePath = getHomePathByRole(user.role)
    uni.reLaunch({
      url: homePath,
      fail: (error) => {
        console.error('跳转首页失败:', error)
        // 如果跳转首页失败，跳转到登录页
        redirectToLogin()
      }
    })
  } else {
    redirectToLogin()
  }
}

/**
 * 处理Token刷新
 */
async function handleTokenRefresh(): Promise<void> {
  try {
    // TODO: 实现Token刷新逻辑
    // const success = await refreshToken()
    // if (!success) {
    //   console.log('Token刷新失败，跳转到登录页')
    //   redirectToLogin()
    // }
  } catch (error) {
    console.error('Token刷新处理失败:', error)
    redirectToLogin()
  }
}

/**
 * 检查Token是否即将过期
 */
function isTokenExpiringSoon(): boolean {
  try {
    const loginTime = uni.getStorageSync('loginTime')
    const expiresIn = uni.getStorageSync('expiresIn')

    if (!loginTime || !expiresIn) return true

    const currentTime = Date.now()
    const expireTime = loginTime + (expiresIn * 1000)
    const fiveMinutes = 5 * 60 * 1000

    return (expireTime - currentTime) <= fiveMinutes
  } catch (error) {
    console.error('检查Token过期状态失败:', error)
    return true
  }
}

/**
 * 安全的页面跳转函数
 */
export function safeNavigateTo(url: string, params?: any): Promise<void> {
  return new Promise((resolve, reject) => {
    // 检查页面权限
    const path = url.split('?')[0]
    if (!canAccessPage(path)) {
      console.warn('无权限访问页面:', path)
      reject(new Error('无权限访问该页面'))
      return
    }

    uni.navigateTo({
      url,
      ...params,
      success: () => {
        resolve()
      },
      fail: (error) => {
        console.error('页面跳转失败:', error)
        reject(error)
      }
    })
  })
}

/**
 * 安全的页面重定向函数
 */
export function safeRedirectTo(url: string, params?: any): Promise<void> {
  return new Promise((resolve, reject) => {
    // 检查页面权限
    const path = url.split('?')[0]
    if (!canAccessPage(path)) {
      console.warn('无权限访问页面:', path)
      reject(new Error('无权限访问该页面'))
      return
    }

    uni.redirectTo({
      url,
      ...params,
      success: () => {
        resolve()
      },
      fail: (error) => {
        console.error('页面重定向失败:', error)
        reject(error)
      }
    })
  })
}

/**
 * 安全的Tab切换函数
 */
export function safeSwitchTab(url: string): Promise<void> {
  return new Promise((resolve, reject) => {
    // 检查页面权限
    if (!canAccessPage(url)) {
      console.warn('无权限访问页面:', url)
      reject(new Error('无权限访问该页面'))
      return
    }

    uni.switchTab({
      url,
      success: () => {
        resolve()
      },
      fail: (error) => {
        console.error('Tab切换失败:', error)
        reject(error)
      }
    })
  })
}

/**
 * 页面显示时的权限检查
 */
export function onPageShow(): void {
  try {
    routeGuard()
  } catch (error) {
    console.error('页面显示权限检查失败:', error)
  }
}

/**
 * 应用启动时的权限检查
 */
export function onAppLaunch(): void {
  try {
    console.log('应用启动，执行权限检查')

    // 检查是否已登录
    if (isLoggedIn()) {
      console.log('用户已登录，跳转到对应首页')
      redirectToHome()
    } else {
      console.log('用户未登录，显示首页')
      // 可以在这里显示引导页或登录页
    }
  } catch (error) {
    console.error('应用启动权限检查失败:', error)
  }
}